import gx from "gx";

export default {
    /**
     * 验证表单中输入的值在数据库中是否存在
     * 使用方法：{ validator: this.$valid.DBHas("Department").bind(this), trigger: "blur", },
     * @param {string} tableName 表名
     * @param {string} tips 提示信息
     * @param {string} field 特殊的字段名，不用带_
     */
    DBHas(tableName, tips = "名称", field = "_NameEqual") {
        if (!tableName) {
            new Error("未提供相应参数");
        }

        tips += "已经存在，请重新输入！";

        return function (rule, value, callback) {

            if (this.old && this.old[rule.field] && value == this.old[rule.field] || gx.IsEmpty(value)) {
                return callback();
            }

            this.$app.CallApi(this.$app.api[tableName].GetCount, {
                data: { [field]: value },
                success: (res) => {
                    if (res > 0) {
                        return callback(new Error(tips));
                    } else {
                        return callback();
                    }
                }
            });
        }
    },

    //整数
    IsInt(tips = "请输入整数") {
        return function (rule, value, callback) {
            if (Gx.IsInt(value)) {
                callback();
            } else {
                callback(new Error(tips));
            }
        }
    },

    //正整数 x>0
    IsIntPositive(tips = "请输入大于0的整数") {
        return function (rule, value, callback) {
            if (Gx.IsIntPositive(value)) {
                callback();
            } else {
                callback(new Error(tips));
            }
        }
    },

    //负整数 x<0
    IsIntNegative(tips = "请输入小于0的整数") {
        return function (rule, value, callback) {
            if (Gx.IsIntNegative(value)) {
                callback();
            } else {
                callback(new Error(tips));
            }
        }
    },

    //正整数 x>=0
    IsIntPositiveByZero(tips = "请输入大于等于0的整数") {
        return function (rule, value, callback) {
            if (Gx.IsIntPositiveByZero(value)) {
                callback();
            } else {
                callback(new Error(tips));
            }
        }
    },

    //负整数 x<=0
    IsIntNegativeByZero(tips = "请输入小于等于0的整数") {
        return function (rule, value, callback) {
            if (Gx.IsIntNegativeByZero(value)) {
                callback();
            } else {
                callback(new Error(tips));
            }
        }
    },

    //数字
    IsNumber(tips = "请输入数字") {
        return function (rule, value, callback) {
            if (Gx.IsNumber(value)) {
                callback();
            } else {
                callback(new Error(tips));
            }
        }
    },

    //正数字 x>0
    IsNumberPositive(tips = "请输入大于0的数字") {
        return function (rule, value, callback) {
            if (Gx.IsNumberPositive(value)) {
                callback();
            } else {
                callback(new Error(tips));
            }
        }
    },

    //负数字 x<0
    IsNumberNegative(tips = "请输入小于0的数字") {
        return function (rule, value, callback) {
            if (Gx.IsNumberNegative(value)) {
                callback();
            } else {
                callback(new Error(tips));
            }
        }
    },

    //正数字 x>=0
    IsNumberPositiveByZero(tips = "请输入大于等于0的数字") {
        return function (rule, value, callback) {
            if (Gx.IsNumberPositiveByZero(value)) {
                callback();
            } else {
                callback(new Error(tips));
            }
        }
    },

    //负数字 x<=0
    IsNumberNegativeByZero(tips = "请输入小于等于0的数字") {
        return function (rule, value, callback) {
            if (Gx.IsNumberNegativeByZero(value)) {
                callback();
            } else {
                callback(new Error(tips));
            }
        }
    },

    //验证小数位必需要有几位，不能没有小数位
    HasPrecision(n = 2, tips = `必需是${n}位小数`) {
        return function (rule, value, callback) {
            if (Gx.HasPrecision(value, n)) {
                callback();
            } else {
                callback(new Error(tips));
            }
        }
    },

    //验证小数位不能小于且大于几位，可以没有小数位
    MaxPrecision(max = 2, min = 1, tips = `小数位应在${min}~${max}位之间`) {
        return function (rule, value, callback) {
            if (Gx.MaxPrecision(value, max, min)) {
                callback();
            } else {
                callback(new Error(tips));
            }
        }
    },

    //自定义正则
    RegexMatch(reg, tips) {
        return function (rule, value, callback) {
            if (Gx.RegexMatch(reg, value)) {
                callback();
            } else {
                callback(new Error(tips));
            }
        }
    },

    //邮箱
    IsEmail(tips = "邮箱格式错误") {
        return function (rule, value, callback) {
            if (Gx.IsEmail(value)) {
                callback();
            } else {
                callback(new Error(tips));
            }
        }
    },

    //手机号
    IsMobile(tips = "手机号格式错误") {
        return function (rule, value, callback) {
            if (Gx.IsMobile(value)) {
                callback();
            } else {
                callback(new Error(tips));
            }
        }
    },

    //固定电话号
    IsTel(tips = "电话号格式错误") {
        return function (rule, value, callback) {
            if (Gx.IsTel(value)) {
                callback();
            } else {
                callback(new Error(tips));
            }
        }
    },

    //联系电话  手机+固话
    IsPhone(tips = "手机或电话号格式错误") {
        return function (rule, value, callback) {
            if (Gx.IsPhone(value)) {
                callback();
            } else {
                callback(new Error(tips));
            }
        }
    },

    //IP地址
    IsIp(tips = "IP地址格式错误") {
        return function (rule, value, callback) {
            if (Gx.IsIp(value)) {
                callback();
            } else {
                callback(new Error(tips));
            }
        }
    },

    //中文
    IsChinese(tips = "请输入中文") {
        return function (rule, value, callback) {
            if (Gx.IsChinese(value)) {
                callback();
            } else {
                callback(new Error(tips));
            }
        }
    },

    //字母
    IsLetter(tips = "请输入字母") {
        return function (rule, value, callback) {
            if (Gx.IsLetter(value)) {
                callback();
            } else {
                callback(new Error(tips));
            }
        }
    },

    //字母与数字
    IsLetterNumber(tips = "请输入字母或数字") {
        return function (rule, value, callback) {
            if (Gx.IsLetterNumber(value)) {
                callback();
            } else {
                callback(new Error(tips));
            }
        }
    },
}
